package view;

import model.Class;
import model.Major;
import model.User;
import service.ClassService;
import service.MajorService;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.HashMap;

public class ClassManagementPanel extends JPanel {
    private JTable classTable; // 班级信息表格
    private DefaultTableModel tableModel; // 表格数据模型
    private ClassService classService; // 班级服务类，用于与班级相关的业务逻辑交互
    private MajorService majorService; // 专业服务类，用于与专业相关的业务逻辑交互
    private JTextField classNameField; // 班级名称输入框
    private JSpinner gradeYearSpinner; // 年级选择器
    private JComboBox<TeacherItem> teacherComboBox; // 教师选择下拉框
    private JComboBox<String> majorComboBox; // 专业选择下拉框
    private Map<String, String> majorCodeMap; // 专业代码映射表

    public ClassManagementPanel() {
        classService = new ClassService(); // 初始化班级服务
        majorService = new MajorService(); // 初始化专业服务
        majorCodeMap = new HashMap<>(); // 初始化专业代码映射表
        initComponents(); // 初始化组件
        loadClassData(); // 加载班级数据
    }

    // 初始化组件
    private void initComponents() {
        setLayout(new BorderLayout(10, 10)); // 设置布局管理器
        setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 设置边距

        // 创建工具栏
        JToolBar toolBar = new JToolBar();
        toolBar.setFloatable(false); // 设置工具栏不可浮动
        toolBar.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); // 设置工具栏边距

        // 设置按钮字体和大小
        Font buttonFont = new Font("微软雅黑", Font.PLAIN, 14);
        Dimension buttonSize = new Dimension(120, 30);

        JButton addButton = new JButton("添加班级");
        JButton editButton = new JButton("编辑班级");
        JButton deleteButton = new JButton("删除班级");
        JButton teacherButton = new JButton("任课教师管理");
        JButton refreshButton = new JButton("刷新");

        // 统一按钮样式
        for (JButton button : new JButton[]{addButton, editButton, deleteButton, teacherButton, refreshButton}) {
            button.setFont(buttonFont); // 设置按钮字体
            button.setPreferredSize(buttonSize); // 设置按钮大小
            button.setFocusPainted(false); // 设置按钮不绘制焦点边框
        }

        toolBar.add(addButton);
        toolBar.addSeparator(new Dimension(10, 0)); // 添加分隔符
        toolBar.add(editButton);
        toolBar.addSeparator(new Dimension(10, 0));
        toolBar.add(deleteButton);
        toolBar.addSeparator(new Dimension(10, 0));
        toolBar.add(teacherButton);
        toolBar.addSeparator(new Dimension(10, 0));
        toolBar.add(refreshButton);

        add(toolBar, BorderLayout.NORTH); // 将工具栏添加到面板的北部

        // 创建表格
        String[] columnNames = {"ID", "班级名称", "年级", "班主任", "所属专业", "班级人数", "创建时间"};
        tableModel = new DefaultTableModel(columnNames, 0) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false; // 表格单元格不可编辑
            }
        };

        classTable = new JTable(tableModel); // 创建表格
        classTable.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 设置表格字体
        classTable.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 14)); // 设置表头字体
        classTable.setRowHeight(30); // 设置行高
        classTable.setAutoCreateRowSorter(true); // 自动创建行排序器
        classTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设置单行选择模式

        // 设置列宽
        int[] columnWidths = {60, 150, 80, 100, 150, 80, 150};
        for (int i = 0; i < columnWidths.length; i++) {
            classTable.getColumnModel().getColumn(i).setPreferredWidth(columnWidths[i]);
        }

        // 创建日期渲染器
        DefaultTableCellRenderer dateRenderer = new DefaultTableCellRenderer() {
            private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                                                           boolean isSelected, boolean hasFocus, int row, int column) {
                if (value instanceof Date) {
                    value = sdf.format((Date) value); // 格式化日期
                }
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        };
        classTable.getColumnModel().getColumn(6).setCellRenderer(dateRenderer); // 设置创建时间列的渲染器

        // 居中对齐渲染器
        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(JLabel.CENTER); // 设置水平居中对齐
        for (int i = 0; i < classTable.getColumnCount(); i++) {
            classTable.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
        }

        // 创建带边框的滚动面板
        JScrollPane scrollPane = new JScrollPane(classTable);
        scrollPane.setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createEmptyBorder(10, 0, 0, 0),
                BorderFactory.createLineBorder(Color.LIGHT_GRAY)
        ));

        add(scrollPane, BorderLayout.CENTER); // 将滚动面板添加到面板的中部

        // 添加按钮事件
        addButton.addActionListener(e -> showAddDialog()); // 添加班级按钮事件
        editButton.addActionListener(e -> editSelectedClass()); // 编辑班级按钮事件
        deleteButton.addActionListener(e -> deleteSelectedClass()); // 删除班级按钮事件
        teacherButton.addActionListener(e -> showTeacherManagementDialog()); // 任课教师管理按钮事件
        refreshButton.addActionListener(e -> loadClassData()); // 刷新按钮事件

        // 添加表格双击事件
        classTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    editSelectedClass(); // 双击表格行时编辑该班级
                }
            }
        });
    }

    // 加载班级数据
    private void loadClassData() {
        tableModel.setRowCount(0); // 清空表格数据
        List<Class> classes = classService.getAllClasses(); // 获取所有班级信息
        for (Class cls : classes) {
            Object[] rowData = {
                    cls.getId(),
                    cls.getClassName(),
                    cls.getGradeYear(),
                    cls.getTeacherName() != null ? cls.getTeacherName() : "未分配", // 设置班主任名称或显示“未分配”
                    cls.getMajorName(),
                    cls.getStudentCount() + "人", // 设置班级人数
                    cls.getCreatedAt() // 设置创建时间
            };
            tableModel.addRow(rowData); // 将班级信息添加到表格
        }
    }

    // 显示添加班级对话框
    private void showAddDialog() {
        JDialog dialog = new JDialog((Frame)SwingUtilities.getWindowAncestor(this), "添加班级", true);
        dialog.setLayout(new BorderLayout(10, 10)); // 设置对话框布局

        // 创建表单面板
        JPanel formPanel = new JPanel(new GridBagLayout());
        formPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 10, 20)); // 设置面板边距
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5); // 设置网格组件的边距
        gbc.fill = GridBagConstraints.HORIZONTAL; // 设置填充方式为水平填充

        // 班级名称
        gbc.gridx = 0; gbc.gridy = 0;
        formPanel.add(new JLabel("班级名称:"), gbc); // 添加班级名称标签

        gbc.gridx = 1;
        JTextField nameField = new JTextField(20); // 创建班级名称输入框
        formPanel.add(nameField, gbc); // 添加班级名称输入框到面板

        // 所属专业
        gbc.gridx = 0; gbc.gridy = 1;
        formPanel.add(new JLabel("所属专业:"), gbc); // 添加所属专业标签

        gbc.gridx = 1;
        JComboBox<MajorItem> majorComboBox = new JComboBox<>(); // 创建专业选择下拉框
        loadMajors(majorComboBox); // 加载专业数据到下拉框
        formPanel.add(majorComboBox, gbc); // 添加专业选择下拉框到面板

        // 年级选择
        gbc.gridx = 0; gbc.gridy = 2;
        formPanel.add(new JLabel("年级:"), gbc); // 添加年级标签

        gbc.gridx = 1;
        JComboBox<String> gradeComboBox = new JComboBox<>();
        int currentYear = Calendar.getInstance().get(Calendar.YEAR); // 获取当前年份
        for (int i = 0; i < 4; i++) {
            gradeComboBox.addItem(String.valueOf(currentYear - i)); // 添加最近4年的选项
        }
        formPanel.add(gradeComboBox, gbc); // 添加年级选择器到面板

        // 班主任选择
        gbc.gridx = 0; gbc.gridy = 3;
        formPanel.add(new JLabel("班主任:"), gbc); // 添加班主任标签

        gbc.gridx = 1;
        JComboBox<TeacherItem> teacherComboBox = new JComboBox<>();
        List<User> teachers = classService.getAllTeachers(); // 获取所有教师信息
        for (User teacher : teachers) {
            teacherComboBox.addItem(new TeacherItem(teacher.getId(), teacher.getName()));
            // 将教师信息添加到下拉框
        }
        formPanel.add(teacherComboBox, gbc); // 添加班主任选择下拉框到面板

        dialog.add(formPanel, BorderLayout.CENTER); // 将表单面板添加到对话框中部

        // 按钮面板
        JPanel buttonPanel = new JPanel();
        JButton saveButton = new JButton("保存");
        JButton cancelButton = new JButton("取消");

        saveButton.addActionListener(e -> {
            String name = nameField.getText().trim(); // 获取班级名称
            MajorItem selectedMajor = (MajorItem)majorComboBox.getSelectedItem(); // 获取选中的专业
            String grade = (String)gradeComboBox.getSelectedItem(); // 获取年级
            TeacherItem selectedTeacher = (TeacherItem)teacherComboBox.getSelectedItem(); // 获取选中的班主任

            if (name.isEmpty() || selectedMajor == null || selectedTeacher == null) {
                JOptionPane.showMessageDialog(dialog, "请填写所有必要信息！"); // 提示用户填写完整信息
                return;
            }

            if (classService.createClass(name, Integer.parseInt(grade),
                    selectedTeacher.getId(), selectedMajor.getCode())) {
                loadClassData(); // 刷新班级信息
                dialog.dispose(); // 关闭对话框
                JOptionPane.showMessageDialog(this, "添加成功！"); // 提示添加成功
            } else {
                JOptionPane.showMessageDialog(dialog, "添加失败！",
                        "错误", JOptionPane.ERROR_MESSAGE); // 提示添加失败
            }
        });

        cancelButton.addActionListener(e -> dialog.dispose()); // 取消按钮事件

        buttonPanel.add(saveButton);
        buttonPanel.add(cancelButton);
        dialog.add(buttonPanel, BorderLayout.SOUTH); // 将按钮面板添加到对话框南部

        // 设置对话框属性
        dialog.setSize(400, 300); // 设置对话框大小
        dialog.setLocationRelativeTo(this); // 设置对话框位置相对于当前面板
        dialog.setResizable(false); // 设置对话框不可调整大小
        dialog.setVisible(true); // 显示对话框
    }

    // 用于ComboBox的教师项
    private static class TeacherItem {
        private int id;
        private String name;

        public TeacherItem(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() { return id; } // 获取教师ID

        public String getName() { return name; } // 获取教师名称

        @Override
        public String toString() { return name; } // 重写toString方法以显示教师名称
    }

    // 编辑选中的班级
    private void editSelectedClass() {
        int selectedRow = classTable.getSelectedRow(); // 获取选中的行
        if (selectedRow < 0) {
            JOptionPane.showMessageDialog(this, "请先选择要编辑的班级！"); // 提示用户选择班级
            return;
        }

        // 获取选中行的数据
        int classId = (int) classTable.getValueAt(selectedRow, 0); // 获取班级ID
        String className = (String) classTable.getValueAt(selectedRow, 1); // 获取班级名称
        int gradeYear = (int) classTable.getValueAt(selectedRow, 2); // 获取年级
        String teacherName = (String) classTable.getValueAt(selectedRow, 3); // 获取班主任名称

        // 创建编辑对话框
        JDialog dialog = new JDialog((Frame) SwingUtilities.getWindowAncestor(this), "编辑班级", true);
        dialog.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);

        // 班级名称
        gbc.gridx = 0; gbc.gridy = 0;
        dialog.add(new JLabel("班级名称："), gbc); // 添加班级名称标签

        gbc.gridx = 1;
        JTextField classNameField = new JTextField(className, 20); // 创建班级名称输入框并设置默认值
        dialog.add(classNameField, gbc); // 添加班级名称输入框到对话框

        // 年级选择
        gbc.gridx = 0; gbc.gridy = 1;
        dialog.add(new JLabel("年级："), gbc); // 添加年级标签

        gbc.gridx = 1;
        JComboBox<String> gradeComboBox = new JComboBox<>();
        int currentYear = Calendar.getInstance().get(Calendar.YEAR); // 获取当前年份
        for (int i = 0; i < 4; i++) {
            gradeComboBox.addItem(String.valueOf(currentYear - i)); // 添加最近4年的选项
        }
        gradeComboBox.setSelectedItem(String.valueOf(gradeYear)); // 设置默认选中的年级
        dialog.add(gradeComboBox, gbc); // 添加年级选择器到对话框

        // 专业选择
        gbc.gridx = 0; gbc.gridy = 2;
        dialog.add(new JLabel("所属专业："), gbc); // 添加所属专业标签

        gbc.gridx = 1;
        JComboBox<MajorItem> majorComboBox = new JComboBox<>();
        loadMajors(majorComboBox); // 加载专业数据到下拉框
        // 获取当前班级的专业信息并设置选中
        model.Class currentClass = classService.getClassById(classId); // 获取班级信息
        if (currentClass != null) {
            for (int i = 0; i < majorComboBox.getItemCount(); i++) {
                MajorItem item = majorComboBox.getItemAt(i);
                if (item.getCode().equals(currentClass.getMajorCode())) {
                    majorComboBox.setSelectedIndex(i); // 设置默认选中的专业
                    break;
                }
            }
        }
        dialog.add(majorComboBox, gbc); // 添加专业选择下拉框到对话框

        // 班主任选择
        gbc.gridx = 0; gbc.gridy = 3;
        dialog.add(new JLabel("班主任："), gbc); // 添加班主任标签

        gbc.gridx = 1;
        JComboBox<TeacherItem> teacherCombo = new JComboBox<>();
        List<User> teachers = classService.getAllTeachers(); // 获取所有教师信息
        TeacherItem selectedTeacherItem = null;

        for (User teacher : teachers) {
            TeacherItem item = new TeacherItem(teacher.getId(), teacher.getName());
            teacherCombo.addItem(item); // 将教师信息添加到下拉框
            if (teacher.getName().equals(teacherName)) {
                selectedTeacherItem = item; // 设置默认选中的班主任
            }
        }
        if (selectedTeacherItem != null) {
            teacherCombo.setSelectedItem(selectedTeacherItem); // 设置班主任选择下拉框的默认选中项
        }
        dialog.add(teacherCombo, gbc); // 添加班主任选择下拉框到对话框

        // 按钮面板
        gbc.gridx = 0; gbc.gridy = 4;
        gbc.gridwidth = 2;
        JPanel buttonPanel = new JPanel();
        JButton saveButton = new JButton("保存");
        JButton cancelButton = new JButton("取消");

        saveButton.addActionListener(e -> {
            String newClassName = classNameField.getText().trim(); // 获取新的班级名称
            String newGrade = (String) gradeComboBox.getSelectedItem(); // 获取新的年级
            TeacherItem selectedTeacher = (TeacherItem) teacherCombo.getSelectedItem(); // 获取新的班主任
            MajorItem selectedMajor = (MajorItem) majorComboBox.getSelectedItem(); // 获取新的专业

            if (newClassName.isEmpty() || selectedTeacher == null || selectedMajor == null) {
                JOptionPane.showMessageDialog(dialog, "请填写所有必要信息！"); // 提示用户填写完整信息
                return;
            }

            // 更新班级信息
            if (classService.updateClass(classId, newClassName, Integer.parseInt(newGrade),
                    selectedTeacher.getId(), selectedMajor.getCode())) {
                dialog.dispose(); // 关闭对话框
                loadClassData(); // 刷新班级信息
                JOptionPane.showMessageDialog(this, "更新成功！"); // 提示更新成功
            } else {
                JOptionPane.showMessageDialog(dialog, "更新失败！",
                        "错误", JOptionPane.ERROR_MESSAGE); // 提示更新失败
            }
        });

        cancelButton.addActionListener(e -> dialog.dispose()); // 取消按钮事件

        buttonPanel.add(saveButton);
        buttonPanel.add(cancelButton);
        dialog.add(buttonPanel, gbc); // 将按钮面板添加到对话框

        dialog.pack();
        dialog.setLocationRelativeTo(this); // 设置对话框位置相对于当前面板
        dialog.setVisible(true); // 显示对话框
    }

    // 删除选中的班级
    private void deleteSelectedClass() {
        int selectedRow = classTable.getSelectedRow(); // 获取选中的行
        if (selectedRow == -1) {
            JOptionPane.showMessageDialog(this, "请选择要删除的班级！", "提示", JOptionPane.INFORMATION_MESSAGE); // 提示用户选择班级
            return;
        }

        int classId = (int) classTable.getValueAt(selectedRow, 0); // 获取班级ID
        String className = (String) classTable.getValueAt(selectedRow, 1); // 获取班级名称

        int choice = JOptionPane.showConfirmDialog(
                this,
                "确定要删除班级 " + className + " 吗？\n注：删除班级将同时删除相关的学生信息！", // 提示信息
                "删除班级",
                JOptionPane.YES_NO_OPTION // 提供“是”和“否”选项
        );

        if (choice == JOptionPane.YES_OPTION) {
            if (classService.deleteClass(classId)) {
                loadClassData(); // 刷新班级信息
                JOptionPane.showMessageDialog(this, "班级删除成功！"); // 提示删除成功
            } else {
                JOptionPane.showMessageDialog(this, "班级删除失败！", "错误", JOptionPane.ERROR_MESSAGE); // 提示删除失败
            }
        }
    }

    // 显示任课教师管理对话框
    private void showTeacherManagementDialog() {
        int selectedRow = classTable.getSelectedRow(); // 获取选中的行
        if (selectedRow == -1) {
            JOptionPane.showMessageDialog(this, "请先选择一个班级！"); // 提示用户选择班级
            return;
        }

        int classId = (int) classTable.getValueAt(selectedRow, 0); // 获取班级ID
        String className = (String) classTable.getValueAt(selectedRow, 1); // 获取班级名称

        JDialog dialog = new JDialog((Frame)SwingUtilities.getWindowAncestor(this),
                className + " - 任课教师管理", true);
        dialog.setLayout(new BorderLayout(10, 10)); // 设置对话框布局

        // 创建表格
        String[] columnNames = {"课程代码", "课程名称", "任课教师", "操作"};
        DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return column == columnNames.length - 1; // 设置“操作”列可编辑
            }
        };

        JTable subjectTable = new JTable(tableModel); // 创建表格
        subjectTable.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 设置表格字体
        subjectTable.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 14)); // 设置表头字体
        subjectTable.setRowHeight(30); // 设置行高

        // 设置操作列
        TableColumn operationColumn = subjectTable.getColumnModel().getColumn(3); // 获取“操作”列
        ButtonEditor buttonEditor = new ButtonEditor(e -> {
            int row = subjectTable.getSelectedRow(); // 获取选中的行
            if (row != -1) {
                int subjectId = (int) tableModel.getValueAt(row, 0); // 获取课程ID
                if ("分配教师".equals(e.getActionCommand())) {
                    showAssignTeacherDialog(classId, subjectId, tableModel); // 显示分配教师对话框
                } else if ("移除".equals(e.getActionCommand())) {
                    removeTeacher(classId, subjectId, tableModel); // 移除教师
                }
            }
        }, "分配教师", "移除");

        operationColumn.setCellRenderer(buttonEditor.getRenderer()); // 设置操作列的渲染器
        operationColumn.setCellEditor(buttonEditor); // 设置操作列的编辑器

        // 加载课程和任课教师数据
        loadSubjectTeacherData(classId, tableModel);

        dialog.add(new JScrollPane(subjectTable), BorderLayout.CENTER); // 将表格添加到对话框中部

        dialog.setSize(800, 400); // 设置对话框大小
        dialog.setLocationRelativeTo(this); // 设置对话框位置相对于当前面板
        dialog.setVisible(true); // 显示对话框
    }

    // 加载课程和任课教师数据
    private void loadSubjectTeacherData(int classId, DefaultTableModel tableModel) {
        tableModel.setRowCount(0); // 清空表格数据
        List<Map<String, Object>> subjectTeachers = classService.getClassSubjects(classId); // 获取班级所有课程及任课教师信息
        for (Map<String, Object> data : subjectTeachers) {
            Object[] rowData = {
                    data.get("subjectId"), // 课程代码
                    data.get("subjectName"), // 课程名称
                    data.get("teacherName"), // 任课教师名称
                    data.get("teacherName") == null ? "分配教师" : "移除" // 操作按钮文本
            };
            tableModel.addRow(rowData); // 将课程信息添加到表格
        }
    }

    // 显示分配教师对话框
    private void showAssignTeacherDialog(int classId, int subjectId, DefaultTableModel tableModel) {
        JDialog dialog = new JDialog((Frame)SwingUtilities.getWindowAncestor(this),
                "分配任课教师", true);
        dialog.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);

        // 教师选择
        gbc.gridx = 0; gbc.gridy = 0;
        dialog.add(new JLabel("选择教师："), gbc); // 添加选择教师标签

        gbc.gridx = 1;
        JComboBox<String> teacherCombo = new JComboBox<>();
        List<User> teachers = classService.getAllTeachers(); // 获取所有教师信息
        Map<String, Integer> teacherIdMap = new HashMap<>();

        for (User teacher : teachers) {
            String displayName = teacher.getName();
            teacherCombo.addItem(displayName); // 将教师名称添加到下拉框
            teacherIdMap.put(displayName, teacher.getId()); // 将教师名称与ID映射
        }
        dialog.add(teacherCombo, gbc); // 添加教师选择下拉框到对话框

        // 按钮面板
        gbc.gridx = 0; gbc.gridy = 1;
        gbc.gridwidth = 2;
        JPanel buttonPanel = new JPanel();
        JButton saveButton = new JButton("保存");
        JButton cancelButton = new JButton("取消");

        saveButton.addActionListener(e -> {
            String selectedTeacher = (String) teacherCombo.getSelectedItem(); // 获取选中的教师名称
            if (selectedTeacher == null) {
                JOptionPane.showMessageDialog(dialog, "请选择教师！"); // 提示用户选择教师
                return;
            }

            int teacherId = teacherIdMap.get(selectedTeacher); // 获取选中教师的ID
            if (classService.assignTeacherToSubject(teacherId, classId, subjectId)) {
                dialog.dispose(); // 关闭对话框
                loadSubjectTeacherData(classId, tableModel); // 刷新课程和任课教师信息
                JOptionPane.showMessageDialog(this, "教师分配成功！"); // 提示分配成功
            } else {
                JOptionPane.showMessageDialog(dialog, "教师分配失败！",
                        "错误", JOptionPane.ERROR_MESSAGE); // 提示分配失败
            }
        });

        cancelButton.addActionListener(e -> dialog.dispose()); // 取消按钮事件

        buttonPanel.add(saveButton);
        buttonPanel.add(cancelButton);
        dialog.add(buttonPanel, gbc); // 将按钮面板添加到对话框

        dialog.pack();
        dialog.setLocationRelativeTo(this); // 设置对话框位置相对于当前面板
        dialog.setVisible(true); // 显示对话框
    }

    // 移除任课教师
    private void removeTeacher(int classId, int subjectId, DefaultTableModel tableModel) {
        int choice = JOptionPane.showConfirmDialog(
                this,
                "确定要移除该任课教师吗？", // 提示信息
                "移除确认",
                JOptionPane.YES_NO_OPTION, // 提供“是”和“否”选项
                JOptionPane.WARNING_MESSAGE // 设置警告图标
        );

        if (choice == JOptionPane.YES_OPTION) {
            // 获取教师ID
            int teacherId = getTeacherIdForSubject(classId, subjectId); // 获取当前课程的教师ID
            if (teacherId > 0 && classService.removeTeacherFromSubject(teacherId, classId, subjectId)) {
                loadSubjectTeacherData(classId, tableModel); // 刷新课程和任课教师信息
                JOptionPane.showMessageDialog(this, "教师移除成功！"); // 提示移除成功
            } else {
                JOptionPane.showMessageDialog(this, "教师移除失败！",
                        "错误", JOptionPane.ERROR_MESSAGE); // 提示移除失败
            }
        }
    }

    // 添加获取教师ID的辅助方法
    private int getTeacherIdForSubject(int classId, int subjectId) {
        List<Map<String, Object>> subjects = classService.getClassSubjects(classId); // 获取班级所有课程及任课教师信息
        for (Map<String, Object> subject : subjects) {
            if (subject.get("subjectId").equals(subjectId)) {
                return (Integer) subject.get("teacherId"); // 返回当前课程的教师ID
            }
        }
        return -1; // 如果未找到教师，返回-1
    }

    // 添加内部类定义
    class ButtonEditor extends DefaultCellEditor {
        private JButton button;
        private ActionListener actionListener;
        private String label1, label2;

        public ButtonEditor(ActionListener listener, String label1, String label2) {
            super(new JCheckBox());
            this.actionListener = listener;
            this.label1 = label1;
            this.label2 = label2;
            button = new JButton();
            button.addActionListener(e -> fireEditingStopped()); // 停止编辑
        }

        public TableCellRenderer getRenderer() {
            return new ButtonRenderer();
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
                                                     boolean isSelected, int row, int column) {
            button.setText(value.toString()); // 设置按钮文本
            return button; // 返回按钮组件
        }

        @Override
        public Object getCellEditorValue() {
            actionListener.actionPerformed(new ActionEvent(button,
                    ActionEvent.ACTION_PERFORMED, button.getText())); // 触发按钮事件
            return button.getText(); // 返回按钮文本
        }
    }

    class ButtonRenderer extends JButton implements TableCellRenderer {
        public ButtonRenderer() {
            setOpaque(true); // 设置按钮不透明
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean hasFocus, int row, int column) {
            setText((value == null) ? "" : value.toString()); // 设置按钮文本
            return this; // 返回按钮组件
        }
    }

    // 用于专业选择的内部类
    private static class MajorItem {
        private String code;
        private String name;

        public MajorItem(String code, String name) {
            this.code = code;
            this.name = name;
        }

        public String getCode() { return code; } // 获取专业代码

        @Override
        public String toString() { return name; } // 重写toString方法以显示专业名称
    }

    // 加载专业列表
    private void loadMajors(JComboBox<MajorItem> comboBox) {
        List<Map<String, Object>> majors = classService.getAllMajors(); // 获取所有专业信息
        for (Map<String, Object> major : majors) {
            comboBox.addItem(new MajorItem(
                    major.get("majorCode").toString(), // 获取专业代码
                    major.get("majorName").toString() // 获取专业名称
            )); // 将专业信息添加到下拉框
        }
    }
}
